﻿using Echart.Model.AreaStyle;
using Echart.Model.Data;
using Echart.Model.Emphasis;
using Echart.Model.ItemStyle;
using Echart.Model.Label;
using Echart.Model.LineStyle;
using Echart.Model.TextStyle;
using Echart.Model.ToolTip;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Echart.Model.Series
{
    public class series
    {
        /// <summary>
        /// 类型
        /// </summary>
        public string type { get; set; }

        /// <summary>
        /// 组件 ID
        /// </summary>
        public string id { get; set; }

        /// <summary>
        /// 系列名称
        /// </summary>
        public string name { get; set; }

        /// <summary>
        /// 系列使用的坐标系
        /// </summary>
        public string coordinateSystem { get; set; }
   
        /// <summary>
        /// 使用的 x 轴的 index，在单个图表实例中存在多个 x 轴的时候有用。
        /// </summary>
        public int? xAxisIndex { get; set; }

        /// <summary>
        /// 使用的 y 轴的 index，在单个图表实例中存在多个 y轴的时候有用。
        /// </summary>
        public int? yAxisIndex { get; set; }

        /// <summary>
        /// 使用的极坐标系的 index，在单个图表实例中存在多个极坐标系的时候有用
        /// </summary>
        public int? polarIndex { get; set; }

        /// <summary>
        /// 标记的图形。
        /// </summary>
        public string symbol { get; set; }

        /// <summary>
        /// 标记的大小
        /// </summary>
        public Array[] symbolSize { get; set; }

        /// <summary>
        /// 标记的旋转角度
        /// </summary>
        public double? symbolRotate { get; set; }

        /// <summary>
        /// 如果 symbol 是 path:// 的形式，是否在缩放时保持该图形的长宽比。
        /// 'start' 'middle' 或者 'center' 'end'
        /// </summary>
        public bool? symbolKeepAspect { get; set; }

        /// <summary>
        /// 坐标轴名称的文字样式。
        /// </summary>
        public Array[] symbolOffset { get; set; }

        /// <summary>
        /// 只在主轴为类目轴（axis.type 为 'category'）时有效。 可选值：
        /// 'auto'：默认，如果有足够空间则显示标志图形，否则随主轴标签间隔隐藏策略。
        /// true：显示所有图形。
        /// false：随主轴标签间隔隐藏策略。
        /// </summary>
        public bool? showAllSymbol { get; set; }

        /// <summary>
        /// 是否显示 symbol, 如果 false 则只有在 tooltip hover 的时候显示
        /// </summary>
        public double? showSymbol { get; set; }

        /// <summary>
        /// 是否开启 hover 在拐点标志上的提示动画效果
        /// </summary>
        public bool? hoverAnimation { get; set; }

        /// <summary>
        /// 高亮扇区的偏移距离。
        /// </summary>
        public double? hoverOffset { get; set; }

        /// <summary>
        /// 是否启用图例 hover 时的联动高亮。
        /// </summary>
        public bool? legendHoverLink { get; set; }

        /// <summary>
        /// 数据堆叠。
        /// </summary>
        public string stack { get; set; }

        /// <summary>
        /// 鼠标悬浮时在图形元素上时鼠标的样式是什么。
        /// </summary>
        public string cursor { get; set; }

        /// <summary>
        /// 是否连接空数据。
        /// </summary>
        public bool? connectNulls { get; set; }

        /// <summary>
        /// 是否裁剪超出坐标系部分的图形，具体裁剪效果根据系列决定：
        /// 散点图：忽略中心点超出坐标系的图形，但是不裁剪单个图形
        /// 柱状图：裁掉所有超出坐标系的部分，但是依然保留柱子的宽度
        /// 折线图：裁掉所有超出坐标系的折线部分，拐点图形的逻辑按照散点图处理
        /// 路径图：裁掉所有超出坐标系的部分
        /// K 线图：忽略整体都超出坐标系的图形，但是不裁剪单个图形
        /// 自定义系列：裁掉所有超出坐标系的部分
        /// 除了自定义系列，其它系列的默认值都为 true，及开启裁剪，如果你觉得不想要裁剪的话，可以设置成 false 关闭。
        /// </summary>
        public bool? clip { get; set; }

        /// <summary>
        /// 是否是阶梯线图。可以设置为 true 显示成阶梯线图，也支持设置成 'start', 'middle', 'end' 分别配置在当前点自动计算的坐标轴最小间隔大小。
        /// </summary>
        public string step { get; set; }

        /// <summary>
        /// 自动计算的坐标轴最大间隔大小。
        /// </summary>
        public label label { get; set; }

        /// <summary>
        /// 折线拐点标志的样式。
        /// </summary>
        public itemStyle itemStyle { get; set; }

        /// <summary>
        /// 线条样式。
        /// </summary>
        public lineStyle lineStyle { get; set; }

        /// <summary>
        /// 区域填充样式。
        /// </summary>
        public areaStyle areaStyle { get; set; }

        /// <summary>
        /// 图形的高亮样式。
        /// </summary>
        public emphasis emphasis { get; set; }

        /// <summary>
        /// 是否平滑曲线显示。
        /// </summary>
        public bool? smooth { get; set; }

        /// <summary>
        /// 折线平滑后是否在一个维度上保持单调性。
        /// </summary>
        public string smoothMonotone { get; set; }

        /// <summary>
        /// 折线图在数据量远大于像素点时候的降采样策略，开启后可以有效的优化图表的绘制效率，默认关闭，也就是全部绘制不过滤数据点。
        /// 可选：
        /// 'average' 取过滤点的平均值
        /// 'max' 取过滤点的最大值
        /// 'min' 取过滤点的最小值
        /// 'sum' 取过滤点的和
        /// </summary>
        public string sampling { get; set; }

        /// <summary>
        /// 使用 dimensions 定义 series.data 或者 dataset.source 的每个维度的信息。
        /// </summary>
        public Array[] dimensions { get; set; }

        /// <summary>
        /// 定义 data 的哪个维度被编码成什么
        /// </summary>
        public object encode { get; set; }

        /// <summary>
        /// 坐标轴在 grid 区域中的次分隔线
        /// </summary>
        public string seriesLayoutBy { get; set; }

        /// <summary>
        /// 如果 series.data 没有指定，并且 dataset 存在，那么就会使用 dataset。datasetIndex 指定本系列使用那个 dataset。
        /// </summary>
        public double? datasetIndex { get; set; }

        /// <summary>
        /// 类目数据
        /// </summary>
        public data[] data { get; set; }

        /// <summary>
        /// 图表标注。
        /// </summary>
        public object markPoint { get; set; }

        /// <summary>
        /// 图表标线。
        /// </summary>
        public object markLine { get; set; }

        /// <summary>
        /// 图表标域。
        /// </summary>
        public object markArea { get; set; }

        /// <summary>
        /// zlevel 值。
        /// </summary>
        public double? zlevel { get; set; }

        /// <summary>
        /// X 轴组件的所有图形的z值
        /// </summary>
        public double? z { get; set; }

        /// <summary>
        /// 是否开启动画。
        /// </summary>
        public bool? animation { get; set; }

        /// <summary>
        /// 是否开启动画的阈值，当单个系列显示的图形数量大于这个阈值时会关闭动画。
        /// </summary>
        public double? animationThreshold { get; set; }

        /// <summary>
        /// 初始动画的时长，支持回调函数，可以通过每个数据返回不同的时长实现更戏剧的初始动画效果：
        /// </summary>
        public double? animationDuration { get; set; }

        /// <summary>
        /// 初始动画的缓动效果
        /// </summary>
        public string animationEasing { get; set; }

        /// <summary>
        /// 初始动画的延迟，支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的初始动画效果。
        /// </summary>
        public double? animationDelay { get; set; }

        /// <summary>
        ///数据更新动画的时长。支持回调函数，可以通过每个数据返回不同的时长实现更戏剧的更新动画效果
        /// </summary>
        public double? animationDurationUpdate { get; set; }

        /// <summary>
        /// 数据更新动画的缓动效果。
        /// </summary>
        public string animationEasingUpdate { get; set; }

        /// <summary>
        ///数据更新动画的延迟，支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的更新动画效果。
        /// </summary>
        public double? animationDelayUpdate { get; set; }

        /// <summary>
        ///  tooltip 设定。
        /// </summary>
        public tooltip tooltip { get; set; }

        /// <summary>
        /// 选中模式，表示是否支持多个选中，默认关闭，支持布尔值和字符串，字符串取值可选'single'，'multiple'，分别表示单选还是多选。
        /// </summary>
        public string selectedMode { get; set; }

        /// <summary>
        /// 选中扇区的偏移距离。
        /// </summary>
        public double? selectedOffset { get; set; }

        /// <summary>
        /// 饼图的扇区是否是顺时针排布。
        /// </summary>
        public bool? clockwise { get; set; }

        /// <summary>
        /// 起始角度，支持范围[0, 360]。
        /// </summary>
        public double? startAngle { get; set; }

        /// <summary>
        /// 最小的扇区角度（0 ~ 360），用于防止某个值过小导致扇区太小影响交互。
        /// </summary>
        public double? minAngle { get; set; }

        /// <summary>
        /// 小于这个角度（0 ~ 360）的扇区，不显示标签（label 和 labelLine）。
        /// </summary>
        public double? minShowLabelAngle { get; set; }

        /// <summary>
        /// 是否展示成南丁格尔图，通过半径区分数据大小。可选择两种模式：
        /// 'radius' 扇区圆心角展现数据的百分比，半径展现数据的大小。
        /// 'area' 所有扇区圆心角相同，仅通过半径展现数据大小。
        /// </summary>
        public string roseType { get; set; }

        /// <summary>
        /// 是否启用防止标签重叠策略，默认开启，在标签拥挤重叠的情况下会挪动各个标签的位置，防止标签间的重叠。
        /// </summary>
        public bool? avoidLabelOverlap { get; set; }

        /// <summary>
        /// 是否在数据和为0（一般情况下所有数据为0） 的时候不显示扇区。
        /// </summary>
        public bool? stillShowZeroSum { get; set; }

        /// <summary>
        /// pie chart组件离容器左侧的距离。
        /// left 的值可以是像 20 这样的具体像素值，可以是像 '20%' 这样相对于容器高宽的百分比，也可以是 'left', 'center', 'right'。
        /// </summary>
        public string left { get; set; }

        /// <summary>
        /// pie chart组件离容器上侧的距离。
        /// left 的值可以是像 20 这样的具体像素值，可以是像 '20%' 这样相对于容器高宽的百分比，也可以是 'top', 'middle', 'bottom'。
        /// </summary>
        public string top { get; set; }

        /// <summary>
        /// pie chart组件离容器右侧的距离。
        /// left 的值可以是像 20 这样的具体像素值，可以是像 '20%' 这样相对于容器高宽的百分比。
        /// </summary>
        public string right { get; set; }

        /// <summary>
        /// pie chart组件离容器下侧的距离。
        /// left 的值可以是像 20 这样的具体像素值，可以是像 '20%' 这样相对于容器高宽的百分比。
        /// </summary>
        public string bottom { get; set; }

        /// <summary>
        /// pie chart组件的宽度。默认自适应。
        /// </summary>
        public string width { get; set; }

        /// <summary>
        /// pie chart组件的高度。默认自适应。
        /// </summary>
        public string height { get; set; }

        /// <summary>
        /// 标签的视觉引导线样式，在 label 位置 设置为'outside'的时候会显示视觉引导线。
        /// </summary>
        public object labelLine { get; set; }

        /// <summary>
        /// 饼图的中心（圆心）坐标，数组的第一项是横坐标，第二项是纵坐标。
        /// 支持设置成百分比，设置成百分比时第一项是相对于容器宽度，第二项是相对于容器高度。
        /// </summary>
        public string[] center { get; set; }

        /// <summary>
        /// 饼图的半径。可以为如下类型
        /// number：直接指定外半径值。
        /// string：例如，'20%'，表示外半径为可视区尺寸（容器高宽中较小一项）的 20% 长度。
        /// Array.<number|string>：数组的第一项是内半径，第二项是外半径。每一项遵从上述 number string 的描述。
        /// </summary>
        public string[] radius { get; set; }

        /// <summary>
        /// 更新数据时的动画效果，可选：
        /// 'transition' 通过改变起始和终止角度，从之前的数据过渡到新的数据。
        /// 'expansion' 数据将整体重新沿圆弧展开。      
        /// </summary>
        public string animationTypeUpdate { get; set; }

        /// <summary>
        /// 初始动画效果，可选
        /// 'expansion' 默认沿圆弧展开的效果。
        /// 'scale' 缩放效果，配合设置 animationEasing = 'elasticOut' 可以做成 popup 的效果。
        /// </summary>
        public string animationType { get; set; }
    }
}
